﻿#region Librerias

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;
using System.DirectoryServices;
using System.Configuration;

using TouresBalon.SEG.Servicio.Nucleo.Entidades;
using TouresBalon.SEG.Servicio.Interfaces;

#endregion


public class ServicioAutenticacion : IServicioAutenticacion
{
	#region IServicioAutenticacion Members

	public Usuario IniciarSesion(Usuario pUsuario)
	{
		// TODO: Pasar esto de pruebas a las capas apropiadas
		DirectoryEntry de;
		
		
		try
		{
			de = ServicioAutenticacion.GetUserLDAPDirectoryEntry (pUsuario);
			
			Console.Write (de.Name);
			
			return pUsuario;
		}
		catch (Exception pEx)
		{
			throw pEx;
		}
	}


	public void RegistrarUsuario(Usuario pUsuario)
	{
		DirectoryEntry de; 
		
		
		try
		{
			de = ServicioAutenticacion.GetAdminLDAPDirectoryEntry ();
			
			
		}
		catch (Exception pEx)
		{
			throw pEx;
		}
	}


	#endregion
	
	#region Utilidades
	
	private static DirectoryEntry GetUserLDAPDirectoryEntry (Usuario pUsuario)
	{
		DirectoryEntry de;
		
		
		de = ServicioAutenticacion.GetLDAPDirectoryEntry ();
		
		de.Username = string.Format ("cn={0},ou={1},{2}", 
			pUsuario.CorreoElectronico, 
			pUsuario.Grupo.Nombre,
			ConfigurationManager.AppSettings ["LDAPDominio"]);
		
		de.Password = pUsuario.Contrasenia;
			
		return de;
	}


	private static DirectoryEntry GetAdminLDAPDirectoryEntry ()
	{
		DirectoryEntry de;


		de = ServicioAutenticacion.GetLDAPDirectoryEntry();

		de.Username = ConfigurationSettings.AppSettings["LDAPUsuarioAdmin"];
		de.Password = ConfigurationSettings.AppSettings["LDAPContraseniaAdmin"];
		
		return de;
	}
	
	
	private static DirectoryEntry GetLDAPDirectoryEntry ()
	{
		DirectoryEntry de;


		de = new DirectoryEntry(
			string.Format ("LDAP://{0}/{1}", 
				ConfigurationManager.AppSettings ["LDAPSocket"], 
				ConfigurationManager.AppSettings ["LDAPDominio"]));
				
		de.AuthenticationType = AuthenticationTypes.Signing;
		
		return de;
	}
	
	#endregion
}
